home *** CD-ROM | disk | FTP | other *** search
Modula Definition | 1990-10-09 | 15.0 KB | 348 lines |
- DEFINITION MODULE VDIInputs;
-
-
- (* Megamax-Modula 2 GEM-Library : Die VDI Eingabefunktionen
- *
- * Autor: Manuel Chakravarty Erstellt : 04.11.87
- *
- * Version 2.2 V#0006
- *)
-
- FROM SYSTEM IMPORT WORD, LONGWORD;
- FROM MOSGlobals IMPORT MemArea;
- FROM GrafBase IMPORT Point, Rectangle, PtrMouseFormDef;
- FROM GEMGlobals IMPORT GemChar, MButtonSet, SpecialKeySet;
- FROM GEMEnv IMPORT DeviceHandle;
-
-
- PROCEDURE RequestLoc ( handle : DeviceHandle;
- start : Point;
- VAR termBut: CHAR;
- VAR loc : Point);
-
- (* Der Mauszeiger wird auf eine bestimmte Position gesetzt,
- * danach wird gewartet, bis eine Taste oder ein Mausknopf
- * gedrückt wird.
- *
- * 'start' -- An diese Stelle wird der Mauszeiger gesetzt.
- * 'termbut' -- Code der Taste, die zum Abbruch führte.
- * ( = 32/33: linke bzw. rechte Maustaste)
- *
- * ACHTUNG: Die Routine funktioniert nur bei physikalisch
- * geöffneten Arbeitsstationen (Devices), jedoch
- * nicht bei virtuellen (wie dem Bildschirm)!
- *)
-
- PROCEDURE TestLoc ( handle : DeviceHandle;
- start : Point;
- VAR termbut : CHAR;
- VAR keyPress, koorChange: BOOLEAN;
- VAR loc : Point);
-
- (* Entspricht 'RequestLoc' nur wird nicht gewartet, bis eine Taste
- * gedrückt ist, sondern gleich zurückgekehrt.
- * Ist 'keyPress = TRUE', so wurde eine Taste betätigt.
- * Ist 'koorChange = TRUE', so wurde der Mauszeiger bewegt.
- *
- * ACHTUNG: Die Routine funktioniert nur bei physikalisch
- * geöffneten Arbeitsstationen (Devices), jedoch
- * nicht bei virtuellen (wie dem Bildschirm)!
- *)
-
-
- (* Die folgenden acht Routinen arbeiten in der aktuellen TOS-Version
- * nicht. Evtl. mit GDOS.
- *)
-
- PROCEDURE RequestValue ( handle : DeviceHandle;
- start : CARDINAL;
- VAR termBut: CHAR;
- VAR value : CARDINAL);
-
- (* Der Startwert 'start' kann vom Anwender solange mit den
- * Cursortasten verändert werden, bis er eine andere Taste
- * drückt.
- * 'value' liefert den neuen Wert und 'termBut' die Taste,
- * mit der abgebrochen wurde.
- * Wert liegt zwischen 1 und 100
- *)
-
- TYPE TValState = (nothingHappened, valueChanged, keyPressed);
-
- PROCEDURE TestValue ( handle : DeviceHandle;
- start : CARDINAL;
- VAR termbut: CHAR;
- VAR status : TValState;
- VAR value : CARDINAL);
-
- (* Entspricht 'RequestValue', nur wird sofort zurückgekehrt und
- * 'status' enthält
- *
- * 'nothingHappened', falls keine Benutzeraktion erfolgte,
- * 'valueChanged' , falls der Wert geändert wurde,
- * 'keyPressed' , falls eine Taste gedrückt wurde.
- *)
-
- PROCEDURE RequestChoice ( handle: DeviceHandle;
- start : CARDINAL;
- VAR choice: CARDINAL);
-
- (* Es wird gewartet bis eine Taste gedrückt wird.
- * War es eine Funktionstaste, so wird deren Nummer in 'choice'
- * geliefert, sonst der in 'start' übergebenen Wert (1 - 10).
- *)
-
- PROCEDURE TestChoice ( handle : DeviceHandle;
- VAR keyPress: BOOLEAN;
- VAR choice : CARDINAL);
-
- (* Wie 'TestChoice', nur wird nicht gewartet. Und es ist 'keyPress
- * = TRUE', falls eine Funktionstaste betätigt wurde.
- *)
-
- PROCEDURE RequestString ( handle : DeviceHandle;
- VAR str : ARRAY OF CHAR;
- echo : BOOLEAN;
- echoLoc: Point);
-
- (* Wartet bis ein String vollständig, durch <Return> abgeschlossen,
- * eingegeben wurde. Falls 'echo = TRUE' ist, wird die Eingabe ab
- * der Position 'echoLoc' auf dem Bildschirm ausgegeben.
- *
- * ACHTUNG: Diese Routine ist in der aktuellen Version nicht impl.
- *)
-
- PROCEDURE TestString ( handle : DeviceHandle;
- VAR str : ARRAY OF CHAR;
- echo : BOOLEAN;
- echoLoc: Point;
- VAR success: BOOLEAN);
-
- (* Entspricht 'RequestString' nur wird nicht auf ein <Return> ge-
- * wartet. Ist 'success = TRUE', so wurde mindestens ein Zeichen
- * gelesen.
- *
- * ACHTUNG: Diese Routine ist in der aktuellen Version nicht impl.
- *)
-
- PROCEDURE RStringCode ( handle : DeviceHandle;
- VAR str : ARRAY OF GemChar;
- echo : BOOLEAN;
- echoLoc: Point);
-
- (* Wie 'RequestString', nur wird sowohl ASCII als auch IBM-Scancode
- * geliefert.
- *
- * ACHTUNG: Diese Routine ist in der aktuellen Version nicht impl.
- *)
-
- PROCEDURE TStringCode ( handle : DeviceHandle;
- VAR str : ARRAY OF GemChar;
- echo : BOOLEAN;
- echoLoc: Point;
- VAR success: BOOLEAN);
-
- (* Wie 'TestString', nur wird sowohl ASCII als auch IBM-Scancode
- * geliefert.
- *
- * ACHTUNG: Diese Routine ist in der aktuellen Version nicht impl.
- *)
-
-
- PROCEDURE SetMouseForm (handle : DeviceHandle;
- newForm: PtrMouseFormDef);
-
- (* Die durch 'newForm' spezifierte Mausform wird durch diese
- * Routine gesetzt.
- *)
-
- PROCEDURE ShowCursor (handle: DeviceHandle; force: BOOLEAN);
-
- (* Der Grafikcursor (Mauszeiger) wird sichtbar gemacht.
- * Da das VDI mitzählt, wie oft der Zeiger versteckt wurde, muß
- * er auch entsprechend oft sichtbar gemacht werden. Dies kann
- * umgangen werden, indem man für 'force' den Wert 'TRUE' an-
- * gibt. Daraufhin wird der Cursor auf alle Fälle angezeigt.
- *
- * ACHTUNG: Diese Funktion darf nur bei physikalisch geöffneten
- * Arbeitstationen (Devices) verwendet werden. Beim
- * Bildschirm (eine virtuelle Arbeitsstation) müssen
- * Sie stattdessen die Funktion "GrafMouse" aus
- * AESGraphics verwenden!
- *)
-
- PROCEDURE HideCursor (handle: DeviceHandle);
-
- (* Der Grafikcursor wird versteckt (unsichtbar).
- * Siehe auch 'ShowCursor'.
- *
- * ACHTUNG: Diese Funktion darf nur bei physikalisch geöffneten
- * Arbeitstationen (Devices) verwendet werden. Beim
- * Bildschirm (eine virtuelle Arbeitsstation) müssen
- * Sie stattdessen die Funktion "GrafMouse" aus
- * AESGraphics verwenden!
- *)
-
- PROCEDURE GetMouseState ( handle : DeviceHandle;
- VAR position: Point;
- VAR buts : MButtonSet);
-
- (* Es wird die aktuelle Position des Mauszeigers ('position')
- * und der Status (gedrückt oder nicht) der Mausknöpfe ('buts')
- * erfragt.
- *)
-
- PROCEDURE KeyboardState (handle: DeviceHandle): SpecialKeySet;
-
- (* Es wird ermittelt welche Sondertasten (Alternate, Control,
- * linke und rechte Shifttaste) gedrückt sind.
- *)
-
-
- (* Mit Hilfe der folgenden Routinen können sogenannte 'Softvektoren',
- * dies sind datentechnisch Prozedurvariablen, 'umgebogen' werden.
- * Im Klartext bedeutet dies, daß für den ursprünglichen Wert der Pro-
- * zedurvariable ein neuer eingesetzt wird. Diese neue Prozedur hat
- * zwei Möglichkeiten, zum einen kann sie die alte Prozedur voll-
- * ständig ersetzen. Andererseits kann sie die zu verarbeitenden Daten
- * lediglich modifizieren, kontrollieren oder protokolieren und da-
- * nach die ursprüngliche Routine aufrufen.
- * Dies Prinzip ist nun folgendermaßen implementiert worden. Zu jedem
- * der Vektoren (Prozedurvariablen) wird eine Liste verwaltet. In diese
- * Liste können Prozeduren mit einer bestimmten Schnittstelle (Para-
- * meterliste) eingetragen und natürlich auch wieder gelöscht werden.
- * Wird nun eine dieser Prozedurvariablen benutzt, so wird zuerst die
- * zuletzt installierte Routine ausgeführt und falls diese es wünscht
- * eine weitere. Dies setzt sich durch die gesamte Liste fort. Wird
- * nun das Listenende erreicht, so wird die, vor dem Aktivieren dieses
- * Moduls aktuelle Prozedur ausgeführt.
- * Jede installierte Routine liefert als Ergebnis einen BOOLEAN-Wert.
- * Ist dieser gleich 'TRUE', so heißt dies, daß mit der Ausführung
- * der in der Liste enthaltenen Prozeduren fortgefahren werden soll.
- * Sonst wird die Kette unterbrochen.
- *
- * Zum Installieren einer Prozedur muß ein 'Carrier' (Träger) übergeben
- * werden, dieser dient erstens als Kennung (handle) und zweitens wird
- * er zur zum Aufbau der Listenstruktur benötigt. Daher ist es von ele-
- * mentarer Wichtigkeit, daß der Carrier global definiert wird und bis
- * zum Entfernen der Routine aus der Liste weder anderweitig verwendet,
- * noch irgendwie freigegeben wird. Weiter muß ein Arbeitsbereich (work-
- * space) für die Prozedur angegeben werden, dieser wird während der Ab-
- * arbeitung der Routine als Stackbereich verwendet, es muß also unbe-
- * dingt sichergestellt werden, daß dieser Speicherbereich erstens zur
- * Verfügung steht, zweitens nicht schon benutzt wird und eine aus-
- * reichende Größe besitzt. In der Regel reichen wohl 2 kByte aus.
- *
- * Achtung: Die Aufrufe der Vektoren geschehen von Interruptroutinen aus.
- * Da große Teile des Betriebssystem nicht oder nur bedingt re-
- * entrantfähig sind, das heißt es darf während eines Betriebs-
- * systemaufrufes noch ein weiterer ausgeführt werden, ist es
- * zu empfehlen, solche Aufrufe (dazu gehöhrt z.B. auch 'Write')
- * nicht in einer Vektorroutine zu tätigen. Es könnten völlig
- * unvorhersehbare Systemabstürze herbeigeführt werden!
- *)
-
-
- TYPE TimerVecCarrier = ARRAY[0..11] OF WORD;
- TimerVecProc = PROCEDURE (): BOOLEAN;
-
- PROCEDURE InstallTimerProc (VAR hdl : TimerVecCarrier;
- newProc : TimerVecProc;
- wsp : MemArea;
- VAR deltaTime: CARDINAL);
-
- (* Der Timervektor stellt eine Prozedurvariable dar, die in bestim-
- * mten Zeitabständen immer wieder aufgerufen wird. Er ist also
- * für das Abarbeiten zyklisch wiederkehrender Aufgaben prädesti-
- * niert.
- * 'hdl' -- der Carrier für die hiermit angemeldete Prozedur
- * 'newProc' -- beschreibt den von ihr zu benutzenden Stack-
- * bereich.
- * 'wsp' -- ebenfalls
- * 'deltaTime' -- Der Zeitabstand zwischen zwei Aufrufen (in Milli-
- * sekunden).
- *)
-
- PROCEDURE RemoveTimerProc (VAR hdl: TimerVecCarrier);
-
- (* Meldet die durch 'hdl' beschriebene Prozedur wieder ab, das
- * heißt sie wird aus der Liste der aufzurufenden Prozeduren
- * gestrichen.
- *)
-
-
- TYPE ButChgVecCarrier = ARRAY[0..9] OF WORD;
- ButChgVecProc = PROCEDURE (VAR (* pressed: *) MButtonSet)
- : BOOLEAN;
-
- PROCEDURE InstallButChgProc (VAR hdl: ButChgVecCarrier;
- newProc: ButChgVecProc;
- wsp : MemArea);
-
- (* Der Button-Change-Vektor wird immer aufgerufen, wenn der Status
- * der Maustasten geändert wurde. Also eine Maustaste gedrückt oder
- * losgelassen wurde. Jeder installierten Routine werden die zur
- * Zeit gedrückten Maustasten (in 'pressed') übergeben. Dieser
- * Wert kann geändert werden und es wird die geänderte Version dann
- * auch vom Betriebssystem übernommen.
- * 'hdl' enthält den Carrier, 'newProc' die neue Prozedur und 'wsp'
- * ihren Stackbereich.
- *)
-
- PROCEDURE RemoveButChgProc (VAR hdl: ButChgVecCarrier);
-
- (* Meldet die mit 'InstallButChgProc' installierte Routine
- * wieder ab.
- *)
-
-
- TYPE MsMoveVecCarrier = ARRAY[0..9] OF WORD;
- MsMoveVecProc = PROCEDURE (VAR (*loc:*) Point)
- : BOOLEAN;
-
- PROCEDURE InstallMsMoveProc (VAR hdl : MsMoveVecCarrier;
- newProc: MsMoveVecProc;
- wsp : MemArea);
-
- (* Der Mouse-Movement-Vektor wird bei jeder Mausbewegung ange-
- * sprungen. Dabei wird der Routine (in 'loc') die aktuelle
- * Mausposition übergegeben, diese kann von der Routine auch
- * verändert werden. Durch Vertauschen der Koordinaten kann man
- * z.B die beiden Bewegungsrichtungen der Maus vertauschen.
- * Mit etwas mehr Aufwand können die Bewegungen auch gespie-
- * gelt werden oder es wird einfach ein Rahmen vorgegeben,
- * der von der Maus nicht verlassen werden darf.
- * Es ist 'hdl' der Carrier und 'wsp' der Stackbereich für die
- * zu installierende Routine 'newProc'.
- *)
-
- PROCEDURE RemoveMsMoveProc (VAR hdl: MsMoveVecCarrier);
-
- (* Es wird 'hdl' abgemeldet.
- *)
-
-
- TYPE CurChgVecCarrier = ARRAY[0..9] OF WORD;
- CurChgVecProc = PROCEDURE (VAR (*loc:*) Point)
- : BOOLEAN;
-
- PROCEDURE InstallCurChgProc (VAR hdl : CurChgVecCarrier;
- newProc: CurChgVecProc;
- wsp : MemArea);
-
- (* Der Cursor-Change-Vektor wird bei jeder Positionsänderung
- * des Mauszeigers aufgerufen. Der aufgerufenen Prozedur wird
- * (in 'loc') die neue Mauszeigerposition übergeben.
- * Dabei ist 'hdl' der Carrier und 'wsp' der Stackbereich der
- * Prozedur 'newProc'.
- *)
-
- PROCEDURE RemoveCurChgProc (VAR hdl: CurChgVecCarrier);
-
- (* Es wird eine mit obiger Prozedur angemeldete Routine wieder
- * abgemeldet.
- *)
-
-
- END VDIInputs.
-